from django.http import JsonResponse
from django.utils.deprecation import MiddlewareMixin
from utils.jwttool import my_jwt
import time
import jwt
from utils.myredis import r

class JWTAuthenticationMiddleware(MiddlewareMixin):
    """
    JWT 认证中间件
    1. 检查白名单路径
    2. 从请求头获取 Token
    3. 验证 Token 有效性
    4. 将用户信息添加到 request 对象
    """

    # 不需要认证的白名单路径
    WHITE_LIST = [
        '/login/',  # 登录接口
        '/send_code/',  # 发送验证码
        '/dingtalk/auth/',  # 钉钉认证
        '/dingtalk/callback/',  # 钉钉回调
    ]

    def process_request(self, request):
        # 检查是否在白名单中
        if any(request.path.startswith(url) for url in self.WHITE_LIST):
            return None

        # 从请求头获取 Token
        auth_header = request.headers.get('Authorization')
        if not auth_header:
            return JsonResponse({'code': 401, 'msg': '未提供认证令牌'}, status=401)

        # 检查 Token 格式
        if not auth_header.startswith('Bearer '):
            return JsonResponse({'code': 401, 'msg': '令牌格式错误'}, status=401)

        token = auth_header.split(' ')[1]


        try:
            # 验证 Token
            payload = my_jwt.decode(token)

            # 检查 Token 是否过期
            if payload['exp'] < int(time.time()):
                return JsonResponse({'code': 401, 'msg': '令牌已过期'}, status=401)
            if r.get_code(token):
                return JsonResponse({'code': 401, 'msg': 'token已失效'}, status=401)

            # 将用户ID添加到 request 对象中
            request.user_id = payload['userid']

        except jwt.ExpiredSignatureError:
            return JsonResponse({'code': 401, 'msg': '令牌已过期'}, status=401)

        except jwt.InvalidTokenError:
            return JsonResponse({'code': 401, 'msg': '无效令牌'}, status=401)

        except Exception as e:
            return JsonResponse({'code': 500, 'msg': f'服务器错误{e}'}, status=500)

        return None